游戏开发之路小结(一):关于太空射击游戏开发实战小结

您所在的位置:网站首页 中粮 每日坚果 漂白 游戏开发之路小结(一):关于太空射击游戏开发实战小结

游戏开发之路小结(一):关于太空射击游戏开发实战小结

2024-06-07 02:07| 来源: 网络整理| 查看: 265

  学习Unity3d游戏开发已经有一年的时间了,一路上磕磕碰碰,也看过很多游戏开发的书籍,这些书籍确实在我学习游戏开发的路上给了我很大的帮助,让我这个初学者对游戏的开发有了一个初步的认知,慢慢我发现游戏开发是一件比较不容易的事情,可以说游戏开发涉及的面非常的广泛,有时候我真的很佩服那些独立的游戏开发者,他们仅仅靠自己的一己之力便完成了一个游戏的开发,这是一件了不起的事情,虽说有些游戏可能涉及的东西不是那么的多,不过要开发一个原创的游戏也是需要动很大脑筋的。于是我便开始学习了一些小游戏的开发,这些游戏虽说都是比较基础的相对简单的游戏,但是里面涉及的一些方法和思想是非常值得我学习的,对别人游戏的研究可以帮助我们了解一些游戏开发的流程,学习到这些对我们以后的游戏开发是非常重要的,下面便是我关于学习太空射击游戏开发的小结,这里说是小结,也是对此次学习的一个记录吧,希望以后再次翻阅此篇随笔的时候会有一些启发或是便于以后再见的时候能够加深自己的理解,促进自己的成长吧。   (一)游戏的主要逻辑和游戏关卡设置

    这个游戏简单说就是两个场景,一个是开始场景,另一个是游戏的主场景,开始场景顾名思义是处理玩家进入的时候的逻辑,大致有一个开始按钮,当玩家按下的时候开始进入主场景,开始设计模式,玩家操纵主场景中的飞机来射击敌人的飞机,敌人的种类可以分为几种,一种是普通的敌人,一种是超级敌人,超级敌人除了继承普通的敌人外,还具有普通敌人不具备的技能,例如伤害更高,生命值更高等,(这里用到面向对象中的继承,为普通敌人加入一个脚本,控制敌人的一些行为,然后再为超级敌人写一个脚本,让他直接继承普通敌人,然后重写部分普通敌人中的方法,这里注意了重写的方法必须是public或者是protected的,包括一些属性也是,不能设置为private这样是没法在继承的脚本中修改或继承的),然后有一个控制玩家输入控制的脚本,用来操作游戏中的玩家对象,还有一些敌人或者玩家附带的处理脚本,最后整个游戏的控制脚本,用来控制游戏的主要逻辑,和协调各个游戏脚本之间的消息传递等等。

  (二)游戏的创建

    这个游戏中虽说简单,但是也不可能面面俱到,只能把游戏中我感觉比较重要或者能学到知识的地方记录下来,便于以后自己查看,废话不多说,现在进入正题,就是脚本的编写。

    1.游戏操作方面的操作控制

     

if(Input.GetKey(KeyCode.UpArrow)) { //注意这里为什么是-=,由于场景中的对象的局部坐标系和世界坐标系是相反的 vMove -= playerSpeed * Time.deltaTime; } //下移 if(Input .GetKey(KeyCode.DownArrow)) { vMove += playerSpeed * Time.deltaTime; } //左移 if(Input.GetKey(KeyCode.LeftArrow)) { hMove += playerSpeed * Time.deltaTime; } //右移 if(Input.GetKey(KeyCode.RightArrow)) { hMove -= playerSpeed * Time.deltaTime; }

      这里主要是处理一些处理玩家移动的脚本,通过键盘上面的上下左右来控制游戏中玩家的移动,这里有一点要注意的是,一定要和上下左右的移动一定要和游戏中玩家的上下左右移动同步,注意主角对象的本地坐标。然后通过Transform类中的Translate方法实现玩家的移动。

//变换位置信息 playerTraform.Translate(new Vector3(hMove,0,vMove));

 

    2.玩家发射子弹

     

//发射子弹,设置子弹的发射速度 rocketRate -= Time.deltaTime; //发射子弹 if (rocketRate < 0) { rocketRate = 0.1f; if (Input.GetMouseButton(0) || Input.GetKey(KeyCode.Space)) { Instantiate(rocket, playerTraform.position, playerTraform.rotation); //CachedObject ch = CachedObject.Create("PlayerRcoket", rocket); //ch.CreateAsset(playerTraform.position, playerTraform.eulerAngles); //播放发射声音 m_audio.PlayOneShot(m_shootClip); } }

    这段代码主要想达到的效果就是当我点下空格键或者鼠标的左键的时候,能让玩家的飞机发射一颗子弹,然后就是一个rocketRate控制玩家发射子弹的速率,间隔多少秒可以发射一次,让画面看起来更加自然。

    3.敌人的脚本

      

//处理敌人的随机移动 protected virtual void EnemyMove() { hMove = Mathf.Sin(Time.time)*Time.deltaTime; enemyTransfrom.Translate(new Vector3(hMove, 0, -enemySpeed*Time.deltaTime)); }

    这里需要注意的一个比较重要的是设置为一个虚方法(virtual)这个用到了C#中的方法的继承与重写一些知识点,后面重写的时候要用到关键字override,,敌人和超级敌人的移动方式可能是不一样的,所以这里要声明一个虚方法,直接看看后面重写的方法。

protected override void EnemyMove() { enemyTransfrom.Translate(new Vector3(0,0,-enemySpeed*Time.deltaTime)); delaySengTime -= Time.deltaTime; if (delaySengTime 0&&Input.GetKeyDown(KeyCode.Escape)) { Time.timeScale = 0; } } void OnGUI() { //暂停游戏 if (Time.timeScale == 0) { //继续按钮 if (GUI.Button(new Rect(Screen.width * 0.5f - 50, Screen.height * 0.4f, 100, 30), "继续游戏")) { Time.timeScale = 1; } //推出游戏按钮 if (GUI.Button(new Rect(Screen.width * 0.5f - 50, Screen.height * 0.6f, 100, 30), "退出游戏")) { Application.Quit(); } } //生命显示 int playerLife = 0; if (playerScript != null) { //获取主角的生命值 playerLife = (int)playerScript.playerLife; } else//游戏对象Player消失 gameover { //放大字体 GUI.skin.label.fontSize = 50; //显示游戏失败 GUI.skin.label.alignment = TextAnchor.LowerCenter; GUI.Label(new Rect(0, Screen.height * 0.2f, Screen.width, 60), "游戏失败"); GUI.skin.label.fontSize = 20; //显示按钮 if (GUI.Button(new Rect(Screen.width * 0.5f - 50, Screen.height * 0.5f, 100, 30), "再试一次")) { //重新读取关卡 Application.LoadLevel(0); } } //显示分数 GUI.skin.label.fontSize = 15; GUI.Label(new Rect(5, 5, 100, 30), "装甲" + playerLife); //显示最高分 GUI.skin.label.alignment = TextAnchor.LowerCenter; GUI.Label(new Rect(0, 5, Screen.width, 30), "记录" + hisScore); //显示分数 GUI.Label(new Rect(0, 25, Screen.width, 30), "得分" + score); } public void AddScore(int point) { score += point; //更新最高分数 if (hisScore


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3